package com.hmall.api.fallback;

import com.hmall.api.client.ItemClient;
import com.hmall.api.dto.ItemDTO;
import com.hmall.api.dto.OrderDetailDTO;
import com.hmall.common.exception.BizIllegalException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;

import java.util.Collection;
import java.util.Collections;
import java.util.List;


/**
 * 商品服务降级工厂类
 * 当商品服务调用失败时，会返回该工厂创建的降级处理类
 */
@Slf4j
public class ItemClientFallback implements FallbackFactory<ItemClient> {
    /**
     * 创建商品服务的降级处理实例
     * @param cause 导致服务降级的异常原因
     * @return 商品服务的降级处理实例
     */
    @Override
    public ItemClient create(Throwable cause) {
        return new ItemClient() {
            /**
             * 查询商品列表的降级方法
             * 当商品列表查询服务不可用时，返回空列表并记录错误日志
             * @param ids 需要查询的商品id集合
             * @return 空的商品列表
             */
            @Override
            public List<ItemDTO> queryItems(Collection<Long> ids) {
                log.error("调用商品id列表查询服务失败：{}",ids, cause);
                return Collections.emptyList();
            }

            /**
             * 扣减商品库存的降级方法
             * 当商品库存扣减服务不可用时，记录错误日志并抛出业务异常
             * @param items 需要扣减库存的商品详情列表
             * @throws BizIllegalException 当库存扣减服务失败时抛出业务异常
             */
            @Override
            public void deductStock(List<OrderDetailDTO> items) {
                log.error("调用商品库存扣减服务失败：{}",items, cause);
                throw new BizIllegalException("调用商品库存扣减服务失败");
            }

            @Override
            public ItemDTO queryItemById(Long id) {
                log.error("调用商品详情查询服务失败：{}",id, cause);
                return null;
            }
        };
    }
}
